package tools

import (
	"bufio"
	"fmt"
	"os"
)

// 定义返回值结构体
// Status中的首字母如果大写，可在包外使用；否则属于包内私有字段
// 这样的写法意味着 Data 字段可以存储任意类型的值。interface{} 是空接口类型，Go 语言中所有类型都实现了空接口，所以任何类型的值都可以赋值给空接口类型的变量
type Result struct {
	Status  bool
	Message string
	Data    interface{} //定义为interface，这样的写法意味着 Data 字段可以存储任意类型的值
}

// 文件是否存在
func FileExist(filePath string) bool {
	if _, err := os.Stat("test.txt"); os.IsNotExist(err) {
		//文件不存在
		return false
	} else {
		//文件存在
		return true
	}
}

// 创建新文件
// filePath 文件路径
// isNotExistCreate 文件不存在则创建
func CreateFile(filePath string, isNotExistCreate bool) Result {
	var res Result
	res.Status = true
	res.Message = "success"
	res.Data = ""

	//设置默认值
	if filePath == "" {
		filePath = "test.txt"
	}

	if isNotExistCreate && FileExist(filePath) {
		res.Message = "文件已存在，无需新创建"
		return res
	}

	file, err := os.Create(filePath)
	if err != nil {
		res.Status = false
		res.Message = err.Error() //这里要使用err.Error()将错误转为字符串
		return res
	}
	defer file.Close() // 确保文件关闭

	res.Message = "创建文件成功"
	return res
}

// 添加内容到文件
func AppendContentToFile(filePath string, content string) Result {
	var res Result
	res.Status = true
	res.Message = "success"
	res.Data = ""

	file, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		res.Status = false
		res.Message = err.Error()
		return res
	}
	defer file.Close()

	file.WriteString(content + "\n")

	res.Message = "向文件追加内容成功"
	return res
}

// 读取文件
// 将内容放到map集合内
func ReadFile(filePath string) Result {
	fileContent := make(map[int]string)

	var res Result
	res.Status = true
	res.Message = "success"
	res.Data = fileContent

	// file, err := os.Open(filePath)
	file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0644)
	if err != nil {
		res.Message = err.Error()
		return res
	}

	scanner := bufio.NewScanner(file)
	lineNumber := 1 //行号
	for scanner.Scan() {
		fileContent[lineNumber] = scanner.Text() //每行的内容
		lineNumber++
	}

	res.Data = fileContent
	return res
}

// 覆盖写文件
func TruncWriteFile(filePath string, content map[int]string) Result {
	var res Result
	res.Status = true
	res.Message = "success"
	res.Data = ""

	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
	if err != nil {
		res.Message = err.Error()
		return res
	}

	len := len(content)
	if len > 0 {
		writer := bufio.NewWriter(file)

		for k, v := range content {
			k = k //这句是废话，但是不加程序异常
			fmt.Fprintln(writer, v)
		}
		writer.Flush()
	}

	return res
}
